import { web } from "@/data_base/models/web.js";
import { response } from "@/utils/response.js";
/**
 * 向 web 表中添加一条新数据
 * @param {Object} data - 包含要添加的网页信息的对象
 * @param {string} data.title - 网页标题
 * @param {string} data.url - 网页 URL
 * @param {string} [data.description] - 网页描述
 * @param {string} [data.favicon] - 网页图标链接
 * @param {string} [data.preview_image] - 网页预览图链接
 * @param {string} [data.category_id] - 网页所属分类 ID
 * @param {Array<string>} [data.tags] - 网页标签数组
 * @param {number} [data.added_date] - 网页添加日期
 * @param {number} [data.visit_count] - 网页访问次数
 * @returns {Promise<Object>} - 一个 Promise，解析为添加成功的记录对象
 */
const add_web = async data => {
	try {
		// 使用 create 方法向 web 表添加数据
		const new_record = await web.create(data);
		return response(200, new_record.toJSON(), "添加网站详情成功！");
	} catch (error) {
		return response(500, null, "添加网站详情失败！");
	}
};

/**
 * 查询 web 表中的所有数据
 * @returns {Promise<Object>} - 一个 Promise，解析为包含所有记录的数组对象
 */
const get_web_all = async () => {
	try {
		// 使用 findAll 方法查询 web 表的所有数据
		const all_records = await web.findAll();
		return response(
			200,
			all_records.map(record => record.toJSON()),
			"查询所有网站详情成功！"
		);
	} catch (error) {
		return response(500, null, "查询所有网站详情失败！");
	}
};

/**
 * 修改 web 表中的某一条数据
 * @param {string} id - 要修改的记录的 ID
 * @param {Object} data - 包含要更新的网页信息的对象
 * @param {string} [data.title] - 网页标题
 * @param {string} [data.url] - 网页 URL
 * @param {string} [data.description] - 网页描述
 * @param {string} [data.favicon] - 网页图标链接
 * @param {string} [data.preview_image] - 网页预览图链接
 * @param {string} [data.category_id] - 网页所属分类 ID
 * @param {Array<string>} [data.tags] - 网页标签数组
 * @param {number} [data.added_date] - 网页添加日期
 * @param {number} [data.visit_count] - 网页访问次数
 * @returns {Promise<Object>} - 一个 Promise，解析为更新成功的记录对象
 */
const update_web = async (id, data) => {
	try {
		// 使用 findByPk 方法根据 ID 查找记录
		const record = await web.findByPk(id);
		if (!record) {
			return response(404, null, "未找到对应的网站记录！");
		}
		// 使用 update 方法更新记录
		await record.update(data);
		return response(200, record.toJSON(), "更新网站详情成功！");
	} catch (error) {
		return response(500, null, "更新网站详情失败！");
	}
};

/**
 * 修改 web 表中的某一条数据的某一个值
 * @param {string} id - 要修改的记录的 ID
 * @param {string} field - 要修改的字段名
 * @param {*} value - 要设置的新值
 * @returns {Promise<Object>} - 一个 Promise，解析为更新成功的记录对象
 */
const update_web_field = async (id, field, value) => {
	try {
		// 使用 findByPk 方法根据 ID 查找记录
		const record = await web.findByPk(id);
		if (!record) {
			return response(404, null, "未找到对应的网站记录！");
		}
		// 检查字段是否存在于记录中
		if (!(field in record)) {
			return response(400, null, "指定的字段不存在！");
		}
		// 更新指定字段的值
		record[field] = value;
		// 保存更新后的记录
		await record.save();
		return response(200, record.toJSON(), "更新网站字段成功！");
	} catch (error) {
		return response(500, null, "更新网站字段失败！");
	}
};

/**
 * 根据 ID 删除 web 表中的某一条数据
 * @param {string} id - 要删除的记录的 ID
 * @returns {Promise<Object>} - 一个 Promise，解析为包含删除操作结果的对象
 */
const delete_web_by_id = async id => {
	try {
		// 使用 findByPk 方法根据 ID 查找记录
		const record = await web.findByPk(id);
		if (!record) {
			return response(404, null, "未找到对应的网站记录！");
		}
		// 使用 destroy 方法删除记录
		await record.destroy();
		return response(200, null, "删除网站记录成功！");
	} catch (error) {
		return response(500, null, "删除网站记录失败！");
	}
};

/**
 * 根据传入的 category_id 数组查询表中不同 category_id 的总数
 * @param {Array<string>} categoryIds - 包含要查询的 category_id 的数组
 * @returns {Promise<Object>} - 一个 Promise，解析为包含不同 category_id 总数的对象
 */
const get_category_id_count = async categoryIds => {
  try {
    if (!Array.isArray(categoryIds) || categoryIds.length === 0) {
      return response(400, null, "category_id 数组不能为空");
    }

    // 使用 count 方法统计不同 category_id 的记录数
    const count = await web.count({
      where: {
        category_id: {
          [web.sequelize.Sequelize.Op.in]: categoryIds
        }
      },
      distinct: true,
      col: 'category_id'
    });

    return response(200, { count }, "查询不同 category_id 总数成功");
  } catch (error) {
    console.error('查询不同 category_id 总数时出错:', error);
    return response(500, null, "查询不同 category_id 总数失败");
  }
};

// 导出新增方法及原有方法
export { add_web, get_web_all, update_web, update_web_field, delete_web_by_id, get_category_id_count };
